﻿using System;
using System.Collections.Generic;
using System.Drawing;
using ebc.componentbinder.Contract;
using kp.compiler.contract;
using kp.koordinator.contract;
using kp.rechenwerk.contract;
using Berechnungsauftrag = kp.koordinator.contract.Berechnungsauftrag;

namespace kp.koordinator
{
  public class Koordinator : IKoordinator
  {
    public event Action<CompilationRequest> OnCompilationRequest;
    public event Action<rechenwerk.contract.Berechnungsauftrag> OnBerechnungsauftrag;


    public void ProcessBerechnungsauftrag(Berechnungsauftrag anfrage)
    {
        var result = this.Berechne(anfrage.formel, anfrage.xMin, anfrage.xMax, anfrage.werteanzahl);
        anfrage.processResult(result);
    }


      internal IEnumerable<PointF> Berechne(string formel, double xMin, double xMax, int werteanzahl)
    {
        Func<double, double> funktion = null;
        this.OnCompilationRequest(new CompilationRequest
                                        {
                                            formel = formel,
                                            processResult = r => funktion = r
                                        });

        IEnumerable<PointF> punkte = null;
        this.OnBerechnungsauftrag(new kp.rechenwerk.contract.Berechnungsauftrag
                                        {
                                          funktion = funktion,
                                          xMin = xMin,
                                          xMax = xMax,
                                          werteanzahl = werteanzahl,

                                          processResult = r => punkte = r
                                        });

        return punkte;
    }
  }
}
